package main

import (
	"context"
	"time"
)

func AsyncAdd(run func() error) {
	//TODO: 扔进异步协程池
	go run()
}

func GetInstance(ctx context.Context, id uint64) (string, error) {
	//data,err := GetFromRedis(ctx,id)
	//if err != nil && err != redis.Nil{
	//	return "", err
	//}
	//// 没有找到数据
	//if err == redis.Nil {
	//	data,err = GetFromDB(ctx,id)
	//	if err != nil{
	//		return "", err
	//	}
	//	//bug AsyncAdd创建了goruntine ，goruntine中的ctx是来自parent节点。如果parent中的context取消了，则此时异步更新失败
	//	//AsyncAdd(func() error{
	//	//	return UpdateCache(ctx,id,data)
	//	//})
	//	//bug fix 在goruntine中创建context，并指定DeadTime,当parent的ctx取消时，不会影响异步更新缓存
	//	AsyncAdd(func() error{
	//		ctxAsync,cancel := context.WithTimeout(context.Background(),3 * time.Second)
	//		defer cancel()
	//		return UpdateCache(ctxAsync,id,data)
	//	})
	//}
	//return data,nil
	return "", nil
}

func GetFromRedis(ctx context.Context, id uint64) (string, error) {
	// TODO: 从redis获取信息
	return "", nil
}

func GetFromDB(ctx context.Context, id uint64) (string, error) {
	// TODO: 从DB中获取信息
	return "", nil
}

func UpdateCache(ctx context.Context, id interface{}, data string) error {
	// TODO：更新缓存信息
	return nil
}

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()
	_, err := GetInstance(ctx, 2021)
	if err != nil {
		return
	}
}
